home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1983-03-29 | 7.0 KB | 203 lines |
- 20 CLS:PRINT
- 30 PRINT " *** RATIONAL TIC-TAC-TOE ***"
- 40 REM BY D. D. HINRICHS - 1977 APRIL
- 50 REM MODIFIED FOR VDM-1 AND TYPED IN BY
- 60 REM FREDRICK AND LYNNE GHOFULPO
- 70 REM 1979 JULY 4TH
- 80 PRINT:PRINT "DO YOU WANT BOARD LAYOUT (Y OR N) ?";
- 85 A$=INKEY$:IF A$="" GOTO 85
- 90 A$=LEFT$(A$,1):IF A$="N"OR A$="n" THEN 330 'SKIP INSTRUCTIONS
- 100 IF A$<>"Y" AND A$<>"y" THEN PRINT:PRINT " W H A T ? ?":GOTO 80
- 110 N=48
- 120 FOR I=1 TO 9
- 124 J=I:IF I>6 THEN J=I-6 ELSE IF I<4 THEN J=I+6
- 130 B(I)=N+J:REM SET BOARD TO IT'S NO.
- 140 NEXT I
- 150 GOSUB 1620:REM DISPLAY PLAYING BOARD
- 160 PRINT:PRINT
- 170 PRINT "COMPUTER MOVES ARE: X"
- 180 PRINT "YOUR MOVES ARE: O":PRINT:PRINT "PRESS ANY KEY TO BEGIN."
- 190 A$=INKEY$:IF A$="" GOTO 190
- 200 CLS
- 210 DATA 4,6,8,2,3,7,0,9,0,0, 7,3,1,4,9,3,7,6,9,4
- 220 DATA 2,8,6,4,1,9,0,7,0,0, 1,9,3,7,2,7,3,8,9,2
- 230 DATA 9,1,8,2,7,3,7,1,2,9, 8,2,1,9,6,4,0,3,0,0
- 240 DATA 9,1,6,3,4,1,9,7,4,3, 6,4,2,8,7,3,0,1,0,0
- 250 DATA 5,8,7,3,6,4,0,9,0,0, 5,8,6,4,1,9,0,7,0,0
- 260 DATA 1,3,5,9,8,5,8,3,1,7, 1,3,7,4,6,0,9,0,8,0
- 270 DATA 3,1,5,7,8,5,8,3,1,7, 1,3,5,8,9,0,0,0,0,0
- 280 DATA 1,5,7,4,6,3,6,5,7,4, 3,1,5,8,7,0,0,0,0,0
- 290 DATA 4,7,5,6,9,5,9,7,4,3, 9,5,7,8,4,7,4,9,5,8
- 300 DATA 5,9,2,8,3,3,2,9,5,6, 5,9,3,2,7,2,3,5,8,9
- 310 DATA 2,3,5,8,9,9,5,3,2,6, 3,2,5,9,7,7,4,5,3,9
- 320 DATA 7,4,3,5,2,3,2,7,4,5
- 330 REM ENTRY POINT TO INTIALIZE FOR NEW GAME
- 340 RESTORE :REM RESET GAME PNTR. TO START
- 350 E=0
- 360 F=INT(RND(1)*2) :REM SET FLAG TO 0 OR 1
- 370 G=1
- 380 H=0
- 390 C1=10
- 400 C2=10
- 410 N=0
- 420 FOR I=1 TO 9 :REM SET BOARD CELLS TO BLANKS
- 430 B(I)=32
- 440 NEXT I
- 450 REM INITIAL COMP. MOVE IS 0, 1, OR 2 (0 THEN CHANGED TO 5)
- 460 C=INT(RND(1)*3) :REM SELECT INITIAL MOVE
- 470 IF C=0 THEN C=5 :REM CENTER OPENING MOVE
- 480 U=10-C :REM PUT COMP. MOVE IN CELL,
- 490 GOSUB 1890 :REM DISP BRD, 1ST USER MOVE
- 500 IF C=5 THEN 1560 :REM CENTER OPENING GAME
- 510 IF C=2 THEN 1170 :REM SIDE OPENING GAME
- 520 IF U=5 THEN 790 :REM CORNER GAME,1ST USER MOV 5
- 530 R=10*U+140 :REM FIND RESPNS. FOR CRNR GAME
- 540 IF U>5 THEN R=R-10
- 550 E=1 :REM REENTRY PNT FOR 5 UNIT RES
- 560 IF F=1 THEN R=R+5
- 570 F=1 :REM REENTRY PNT FOR 7 UNIT RES
- 580 IF R=0 THEN 620
- 590 FOR I=1 TO R
- 600 READ C :REM INCREMENT DATA PNTR TO 1ST
- 610 NEXT I
- 620 REM REENTRY POINT TO SELECT COMPUTER RESPONSES
- 630 F=F-1
- 640 F=F*F :REM FLIP FLAG
- 650 READ C :REM SELECT COM. RESP. FROM LIB
- 660 C2=C1
- 670 C1=C :REM UPDATE COMPUTER RESPONSE
- 680 N=N+1 :REM INCREMENT RESPONSE NO.
- 690 IF C=0 OR C=U THEN 620 :REM IF SPACER OR MATCH,TRY AGN
- 700 B(C)=88 :REM PUT COM. MOVE IN CELL
- 710 IF C2=0 OR C=H THEN 990 :REM DRAW GAME
- 720 IF F=1 THEN 1850 :REM COMPUTER WINS
- 730 IF E=0 THEN 750
- 740 IF N=5 THEN 1850 :REM COMPUTER WINS
- 750 GOSUB 1620 :REM DISPLAY UPDATED BOARD
- 760 GOSUB 1740 :REM ACCEPT NEXT USER MOVE
- 770 GOTO 620 :REM LOOP TO NEXT SEL. RESPON.
- 780 :
- 790 REM CORNER OPENING GAME, 1ST USER MOVE WAS 5.
- 800 U=1 :REM PUT COM. MOVE (9) IN CELL,
- 810 GOSUB 1890 :REM DISP.BRD, 2ND USER MOVE
- 820 IF U=3 OR U=7 THEN 1100 :REM 2ND USER MOV IS 3 OR 7
- 830 IF U=4 OR U=8 THEN G=0 :REM 2ND USER MOV IS 4 OR 8
- 840 GOSUB 1890 :REM CALC RES, DISP 3RD MOV
- 850 C=7
- 860 IF G=0 THEN C=3 :REM SET TRIAL COM. MOVES
- 870 IF C<>U THEN 1840 :REM TRIAL CORRECT, COM WINS
- 880 GOSUB 1890 :REM ELSE, DISP 4TH MOVE
- 890 IF G=0 THEN 940
- 900 C=2
- 910 IF B(2)<>32 THEN C=6 :REM SET TRIAL MOVES
- 920 IF B(C)=32 THEN 1840 :REM TRIAL CORRECT, COM WINS
- 930 GOTO 970
- 940 C=4
- 950 IF B(4)<> 32 THEN C=8 :REM SET COM TRIAL MOVES
- 960 IF B(C)=32 THEN 1840 :REM TRIAL CORRECT, COM WINS
- 970 C=10-U :REM CAL FINAL MOVE FOR DRAW
- 980 B(C)=88 :REM PUT COM MOVE IN CELL
- 990 GOSUB 1620 :REM DISP DRAW GAME BOARD
- 1000 PRINT
- 1010 PRINT"CONGRATULATIONS-YOU GOT A DRAW GAME"
- 1020 PRINT: PRINT "DO YOU WANT TO PLAY ANOTHER GAME (Y OR N)?";
- 1030 A$=INKEY$:IF A$="" THEN 1030
- 1040 IF A$="Y" OR A$="y" THEN CLS: GOTO 330
- 1050 IF A$<>"N" AND A$<>"n" THEN PRINT: PRINT " W H A T ? ? ": GOTO 1020
- 1060 PRINT
- 1070 PRINT " SO LONG UNTIL NEXT TIME"
- 1080 GOTO 1970
- 1090 REM CORNER OPENING GAME, 1ST USER MOVE 5, 2ND MOVE 3 OR 7
- 1100 C0=2
- 1110 IF U=3 THEN C0=4 :REM SET TRIAL COM MOVE
- 1120 GOSUB 1890 :REM CALC ACCEPT 3RD MOVE
- 1130 C=C0
- 1140 IF U=C THEN C=C+4 :REM ADJUST TRIAL COM MOVES
- 1150 GOTO 1840 :REM COM WINS WITH ADJUST.MOV
- 1160 :
- 1170 REM SIDE OPENING GAME REENTRY POINT
- 1180 IF U=8 THEN 1260 :REM SKIP IF 1ST MOVE IS 8
- 1190 R=10*U+60 :REM FIND RESP. FOR SIDE GAME
- 1200 IF U=1 THEN R=80
- 1210 IF INT(U/2)=U/2 THEN 550 :REM RET. TO SEL RESPONSES
- 1220 IF U>6 THEN E=1
- 1230 GOTO 570 :REM RET TO SEL RESPONSES
- 1240 :
- 1250 REM SIDE OPENING GAME, 1ST USER MOVE IS 8
- 1260 B(9)=88 :REM COM RESP. IS 9
- 1270 GOSUB 1620 :REM DISPLAY UP DATE BRD
- 1280 GOSUB 1740 :REM ACCEPT 2ND USER MOVE
- 1290 IF U<4 THEN 1390
- 1300 IF U>5 THEN 1470
- 1310 B(3)=88 :REM COM RESPONSE IS 3
- 1320 GOSUB 1620 :REM DISPLAY UPDATED BRD
- 1330 GOSUB 1740 :REM ACCEPT 3RD USER MOVE
- 1340 C=1
- 1350 IF U=1 THEN C=6 :REM COM RESP IS 1 OR 6
- 1360 GOTO 1840 :REM COMPUTER WINS
- 1370 :
- 1380 REM SIDE OPENING GAME, 1ST MOVE 8, 2ND USER 1 OR 3.
- 1390 F=0
- 1400 H=6
- 1410 IF U<>1 THEN 1440 :REM SETUP 5 LAST RESPONSES
- 1420 F=1
- 1430 H=4
- 1440 R=140 :REM SET RESPONSE ENTRY PNT.
- 1450 GOTO 550 :REM RET TO SELECT RESPONSES
- 1460 :
- 1470 REM SIDE OPENING GAME, 1ST USER MOVE 8, 2ND 6 OR 7.
- 1480 B(1)=88 :REM COM RESPONSE IS 1.
- 1490 GOSUB 1620 :REM DISPLAY UPDATE BRD
- 1500 GOSUB 1740 :REM ACCEPT 3RD USER MOVE
- 1510 C=3
- 1520 IF U=3 THEN C=5 :REM COM RESP IS 3 OR 5
- 1530 GOTO 1840 :REM COMPUTER WINS
- 1540 :
- 1550 REM CENTER OPENING GAME REENTRY POINT
- 1560 R=U*10-10 :REM FIND RESP FOR CENTER GAME
- 1570 IF U>5 THEN R=R-10
- 1580 IF INT(U/2)=U/2 THEN 550 :REM RET TO SELECT RESPONSES
- 1590 GOTO 570 :REM RET TO SELECT RESPONSES
- 1600 :
- 1610 REM DISPLAY SUBROUTINE TO PRINT UPDATED BOARD
- 1620 CLS
- 1630 PRINT: PRINT
- 1640 PRINT TAB(29) "l l"
- 1650 PRINT TAB(27) CHR$(B(1));" l ";CHR$(B(2));" l ";CHR$(B(3))
- 1660 PRINT TAB(25) "----+---+----"
- 1670 PRINT TAB(27) CHR$(B(4));" l ";CHR$(B(5));" l ";CHR$(B(6))
- 1680 PRINT TAB(25) "----+---+----"
- 1690 PRINT TAB(27) CHR$(B(7));" l ";CHR$(B(8));" l ";CHR$(B(9))
- 1700 PRINT TAB(29) "l l"
- 1710 RETURN
- 1720 :
- 1730 REM SUBROUTINE TO CHECK AND ACCEPT NEW USER MOVE.
- 1740 PRINT: PRINT "YOUR MOVE IS"
- 1742 U$=INKEY$:IF U$="" GOTO 1742 ELSE IF LEN(U$)=2 GOTO 1815
- 1750 U=VAL(U$):IF U<1 OR U>9 THEN 1800
- 1760 IF INT(U)<>U THEN 1800
- 1762 IF U>6 THEN U=U-6 ELSE IF U<4 THEN U=U+6
- 1770 IF B(U)<>32 THEN 1800
- 1780 B(U)=79
- 1790 RETURN
- 1800 PRINT "YOUR MOVE IS ILLEGAL. TRY AGAIN."
- 1810 GOTO 1740
- 1815 PRINT "PRESS 'Num Lock' key if you are using mumeric keypad.":GOTO 1800
- 1820 :
- 1830 REM ROUTINE FOR WHEN THE COMPUTER WINS GAME.
- 1840 B(C)=88 :REM PUT COM MOVE IN CELL
- 1850 GOSUB 1620 :REM DISPLAY WINNING GAME
- 1860 PRINT
- 1870 PRINT "***** I WON *****"
- 1880 GOTO 1020 :REM NEW GAME ?
- 1890 :
- 1900 REM SUBROUTINE FOR COMBINED CALC ENTERING, DISPLAY, MOVE
- 1910 C=10-U
- 1920 B(C)=88
- 1930 GOSUB 1620
- 1940 GOSUB 1740
- 1950 RETURN
- 1960 :
- 1970 FOR I=1 TO 5000:NEXT I:CLS
- 1980 END
-